package com.xq.service.impl;

import cn.hutool.http.HttpUtil;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.tomcat.util.security.MD5Encoder;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class TaiguoPayServiceImpl {

    public static void main(String[] args) {
        createOrder();
    }

    public static void createOrder(){
        String url="https://pay.sepropay.com/sepro/pay/web";
        /*version 版本号 String N 需同步返回 JSON 必填，固定值 1.0
        mch_id 商户号 String Y 平台分配唯一
        notify_url 后台通知地址 String Y 不超过 200 字节
        page_url 前台通知地址 String N 不超过 200 字节
        mch_order_no 商家订单号 String Y 保证每笔订单唯一
        pay_type 支付类型 String Y 请查阅商户后台通道编码
        trade_amount 交易金额 String Y 以元为单位
        order_date 订单时间 String Y 时间格式 yyyy-MM-dd HH:mm:ss
        bank_code 银行代码 String N 网银通道必填，其他类型无需填写
        goods_name 商品名称 String Y 不超过 50 字节
        mch_return_msg 透传参数 String N 不超过 200 字节
        sign_type 签名方式 String Y 固定值 MD5，不参与签名
        sign 签名 String Y 不参与签名*/
        Map map = Maps.newHashMap();
        map.put("version","1.0");
        map.put("mch_id","933933802");
        map.put("notify_url","http://www.baidu.com");
        String mchOrderNo = String.valueOf(System.currentTimeMillis());
        map.put("mch_order_no",mchOrderNo);
        map.put("pay_type","320");
        map.put("trade_amount","101");
        map.put("order_date", DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
        map.put("goods_name","商品支付测试");
        map.put("mch_return_msg","");
        map.put("sign_type","MD5");
        map.put("sign",sign(map,"VJK800TPNSTXM11IXR1KHXJELZPRLYJF"));

        String res = HttpUtil.post(url,map);
        System.out.println(res);

        String str ="2021-06-01 00:00:00";

        //投诉时间
        //Date date = DateUtils.parseDate(str,"yyyy-MM-dd HH:mm:ss");
        //DateUtils.addDays(date,5);


    }


    /**
     *
     * @param text
     *            明文
     * @return 32位密文
     */
    public static String md5Encode(String text) {
        String str=null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            str = MD5Encoder.encode(md.digest(text.getBytes()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return str;
    }


    /**
     * 使用 Map按key进行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByKey(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<String, String> sortMap = new TreeMap<String, String>();
        Iterator<String> iter = map.keySet().iterator();
        while(iter.hasNext()){
            String key=iter.next();
            String value = map.get(key);
            if("sign_type".equals(key)){
                continue;
            }
            if("sign".equals(key)){
                continue;
            }
            if(value==null || value.equals("")){
                continue;
            }
            sortMap.put(key,value);
        }
        return sortMap;
    }


    /**
     * 签名
     */
    public static String sign(Map<String,String> map,String appSercret){
        System.out.println("排序前："+map);
        map=sortMapByKey(map);
        System.out.println("排序后"+map);

        List<Object> list=new ArrayList<Object>();
        String str="";
        Iterator<String> iter = map.keySet().iterator();
        while(iter.hasNext()){
            String key=iter.next();
            Object value = map.get(key);
            list.add(key+"="+value);
        }
        list.add("key="+appSercret);
        str = StringUtils.join(list,"&");
        System.out.println(str);
        return md5Encode(str);
    }
}
